package main

import (
	"log"
	"net/netip"
	"sync"

	"github.com/gofiber/fiber/v2"
	"github.com/oschwald/geoip2-golang/v2"
)

const mmdbPath = "/app/GeoLite2-City.mmdb"

func main() {
	// 打开GeoIP数据库
	db, err := geoip2.Open(mmdbPath)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 使用goroutine池来管理并发
	var wg sync.WaitGroup

	// 创建Fiber应用
	app := fiber.New()

	// 设置最大并发数，避免过高的资源占用
	app.Get("/ip/:ip", func(c *fiber.Ctx) error {
		wg.Add(1)
		defer wg.Done()

		ipStr := c.Params("ip")
		ip, err := netip.ParseAddr(ipStr)
		if err != nil {
			return c.Status(400).SendString("Invalid IP address")
		}

		// 执行GeoIP查询
		rec, err := db.City(ip)
		if err != nil {
			return c.Status(500).SendString(err.Error())
		}

		// 返回查询结果
		return c.JSON(rec)
	})

	// 使用最大并发数处理请求
	go func() {
		wg.Wait()
	}()

	// 启动服务
	log.Fatal(app.Listen(":3000"))
}

